package com.rustic.server.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rustic.server.dto.TravelPlanAddDTO;
import com.rustic.server.dto.TravelPlanAuditDTO;
import com.rustic.server.dto.TravelPlanUpdateDTO;
import com.rustic.server.po.TravelPlan;
import com.rustic.server.query.TravelPlanAdminListQuery;
import com.rustic.server.query.TravelPlanUserListQuery;
import com.rustic.server.vo.TravelPlanWebVO;
import com.rustic.server.vo.list.TravelPlanAdminListVO;
import com.rustic.server.vo.list.TravelPlanWebListVO;

import java.util.List;
import java.util.Map;

/**
 * 表[travel_plan]对应的服务类
 *
 * @author auto
 */

public interface TravelPlanService extends IService<TravelPlan> {

    String TRAVEL_PLAN_NOT_EXIST = "旅游攻略不存在";

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList id列表
     * @return 旅游攻略列表
     */
    List<TravelPlan> listByIdIn(List<Integer> idList);

    /**
     * 查询（根据ID 批量查询）并转换成Map
     *
     * @param idList id列表
     * @return 旅游攻略列表
     */
    Map<Integer, TravelPlan> mapByIdIn(List<Integer> idList);

    /**
     * 管理列表查询条件
     *
     * @param query 查询参数
     * @return 查询条件
     */
    LambdaQueryWrapper<TravelPlan> toAdminListWrapper(TravelPlanAdminListQuery query);

    /**
     * toAdminListVo
     *
     * @param travelPlanList travelPlanList
     * @return AdminListVO
     */
    List<TravelPlanAdminListVO> toAdminListVo(List<TravelPlan> travelPlanList);

    /**
     * toWebListVo
     *
     * @param travelPlanList travelPlanList
     * @param userId         用户id
     * @return WebListVo
     */
    List<TravelPlanWebListVO> toWebListVo(List<TravelPlan> travelPlanList, int userId);

    /**
     * 用户查询攻略列表查询条件
     *
     * @param query 查询参数
     * @return 查询条件
     */
    LambdaQueryWrapper<TravelPlan> toUserListWrapper(TravelPlanUserListQuery query);

    /**
     * 用户查询个人作品
     *
     * @param query  查询参数
     * @param userId 用户id
     * @return 查询条件
     */
    LambdaQueryWrapper<TravelPlan> toUserWorksListWrapper(TravelPlanUserListQuery query, int userId);

    /**
     * 前台用户添加旅游攻略
     *
     * @param travelPlanAddDTO travelPlanAddDTO
     * @param userId           用户id
     */
    void add(TravelPlanAddDTO travelPlanAddDTO, int userId);

    /**
     * 前台用户更新旅游攻略
     *
     * @param travelPlanUpdateDTO travelPlanUpdateDTO
     * @param userId              用户id
     */
    void update(TravelPlanUpdateDTO travelPlanUpdateDTO, int userId);

    /**
     * 管理员审核旅游攻略
     *
     * @param travelPlanAuditDTO 审核信息
     * @param adminId            管理员id
     * @param username           管理员账号
     */
    void audit(TravelPlanAuditDTO travelPlanAuditDTO, int adminId, String username);

    /**
     * 前台展示旅游攻略详情
     *
     * @param id 攻略id
     * @return TravelPlanWebVO
     */
    TravelPlanWebVO getByIdToWeb(int id);

    /**
     * 前台用户编辑旅游攻略详情
     *
     * @param id     攻略id
     * @param userId 用户id
     * @return TravelPlanWebVO
     */
    TravelPlanWebVO getByIdToCreator(int id, int userId);
}
